﻿using System;

using System.Linq;

using System.Web.Mvc;
using App.Interface;
using AutoMapper;
using Domain.Entidades;
using SiteCredivale.Areas.Intranet.Relatorios;
using PagedList;

using SiteCredivale.ViewModels;
using CrystalDecisions.CrystalReports.Engine;
using System.IO;
using Services;
using System.Collections.Generic;
using System.Diagnostics;

namespace SiteCredivale.Areas.Intranet.Controllers
{
    public class Usuarios_afastadosController : Controller
    {

        private readonly IUsuarioAppService _usuarioapp;
        private readonly IAfastamentoAppService _afastadosapp;


        public ViewResult _rodape_intra()
        {
            return View();
        }


        public Usuarios_afastadosController(IUsuarioAppService usuarioapp,IAfastamentoAppService afastadosapp)
        {
            _usuarioapp = usuarioapp;
            _afastadosapp = afastadosapp;
        }

        [Authorize]
        public ActionResult Inserir()
        {
            

            if (_usuarioapp.verifica_permissao(5343) == false)
            {
                TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário,por favor contate o suporte !";
                return RedirectToAction("Manutencao", "Aviso");
            }

            ViewBag.tip_codigo = new SelectList(_afastadosapp.busca_tipos().ToList(), "tip_codigo", "tip_descricao");
            return View();
        }
        [HttpPost, Authorize]
        public ActionResult Deletar(string codigo, string dt1, string dt2, string pagina,string unidade)
        {
            try
            {
                if (_usuarioapp.verifica_permissao(5345) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário,por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Usuarios_afastados");
                }

                _afastadosapp.Deletar(_afastadosapp.carrega_busca(int.Parse(codigo)));
                return RedirectToAction("Manutencao", "Usuarios_afastados", new { page = int.Parse(pagina), dt1 = dt1,dt2 = dt2,unidade=int.Parse(unidade)});
            }

            

            catch (Exception ex)
            {
                TempData["msg_err"] = ex.Message ;
                return RedirectToAction("Manutencao", "Usuarios_afastados", new { page = int.Parse(pagina), dt1 = dt1, dt2 = dt2, unidade = int.Parse(unidade) });
            }
        }

        [Authorize]
        public ActionResult Visualizar(int? codigo)
        {
            try
            {


            if (_usuarioapp.verifica_permissao(5339) == false)
            {
                TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                return RedirectToAction("Home", "Inicio");
            }

                if (codigo == null)
                {
                    return RedirectToAction("Manutencao", "Usuarios_afastados");

                }

                usuarios_afastadosViewModel usu = Mapper.Map<usuarios_afastados, usuarios_afastadosViewModel>(_afastadosapp.carrega_busca(int.Parse(codigo.ToString())));
            ViewBag.tip_codigo = new SelectList(_afastadosapp.busca_tipos(), "tip_codigo", "tip_descricao", usu.tip_codigo);
            return View(usu);


            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        [Authorize]
        public ActionResult Editar(int codigo)
        {
            try
            {
                if (_usuarioapp.verifica_permissao(2103) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Usuarios_afastados");
                }

              
                usuarios_afastados afastados = _afastadosapp.carrega_busca(codigo);
                ViewBag.tip_codigo = new SelectList(_afastadosapp.busca_tipos(), "tip_codigo", "tip_descricao", afastados.tip_codigo);
                return View(Mapper.Map<usuarios_afastados, usuarios_afastadosViewModel>(afastados));
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        [HttpPost, Authorize, ValidateInput(false)]
        public ActionResult Editar(usuarios_afastadosViewModel afastados)
        {

            try
            {

                ModelState.Clear();
                if (string.IsNullOrEmpty(afastados.usu_nome))
                {
                    ModelState.AddModelError("usu_nome", " *O usuário deve ser selecionado.");
                }


                if (string.IsNullOrEmpty(afastados.data_inicio.ToString()))
                {
                    ModelState.AddModelError("data_inicio", " *Campo deve ser preenchido");
                }


                if (afastados.tip_codigo != 5 && string.IsNullOrEmpty(afastados.data_fim.ToString()))
                {
                    ModelState.AddModelError("data_fim", " *Campo deve ser preenchido");
                }
                if (afastados.data_fim != null)
                {


                    if (afastados.data_inicio.Date > DateTime.Parse(afastados.data_fim.ToString()).Date)
                    {
                        ModelState.AddModelError("data_fim", " *Data final não pode ser menor que a data inicial");
                    }
                }
                if (afastados.data_inicio.Date <= DateTime.Now.Date)
                {
                    ModelState.AddModelError("data_inicio", " *Data início não pode ser menor nem igual que a data atual");
                }
                if (ModelState.IsValid)
                {
                  

                    _afastadosapp.Editar(Mapper.Map<usuarios_afastadosViewModel, usuarios_afastados>(afastados));
                    ModelState.Clear();
                    ViewBag.res = "Afastamento de colaborador alterado com sucesso!";
                    ViewBag.tip_codigo = new SelectList(_afastadosapp.busca_tipos(), "tip_codigo","tip_descricao",afastados.tip_codigo);
                }
                else
                {
                    ViewBag.tip_codigo = new SelectList(_afastadosapp.busca_tipos().ToList(), "tip_codigo", "tip_descricao", afastados.tip_codigo);

                }

                return View(afastados);
            }
            catch (Exception ex)
            {

                ViewBag.tip_codigo = new SelectList(_afastadosapp.busca_tipos(), "tip_codigo", "tip_descricao", afastados.tip_codigo);
                ViewBag.err = ex.Message;
                return View(afastados);
            }


        }

        private void executa_bloqueio(int usuario)
        {
            try
            {
                var proc = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        FileName = @"C:\Importação\Importação bancoob.exe",
                        Arguments = "1;" + usuario.ToString(),
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        RedirectStandardError = true,
                        RedirectStandardInput = true,
                        WorkingDirectory = @"C:\Importação",
                        CreateNoWindow = true
                    }
                };
                proc.Start();
            }
            catch (Exception ex)
            {

                throw ex;
            }
          



        }

        [HttpPost, Authorize, ValidateInput(false)]
        public ActionResult Inserir(usuarios_afastadosViewModel afastados)
        {

            try
            {

                ModelState.Clear();
                if (string.IsNullOrEmpty(afastados.usu_nome))
                {
                    ModelState.AddModelError("usu_nome", " *O usuário deve ser selecionado.");
                }


                if (string.IsNullOrEmpty(afastados.data_inicio.ToString()))
                {

                    ModelState.AddModelError("data_inicio", " *Campo deve ser preenchido");
                }


                if (afastados.tip_codigo != 5 && string.IsNullOrEmpty(afastados.data_fim.ToString()))
                {
                    ModelState.AddModelError("data_fim", " *Campo deve ser preenchido");
                }
                if (afastados.data_fim != null)
                {
              
                if (afastados.data_inicio.Date > DateTime.Parse(afastados.data_fim.ToString()).Date)
                {
                    ModelState.AddModelError("data_fim", " *Data final não pode ser menor que a data inicial");
                }
                }
                if (afastados.data_inicio.Date < DateTime.Now.Date)
                {
                    ModelState.AddModelError("data_inicio", " *Data início não pode ser menor nem igual que a data atual");
                }
                if (ModelState.IsValid)
                {
                   



                    _afastadosapp.Inserir(Mapper.Map<usuarios_afastadosViewModel, usuarios_afastados>(afastados));

                    if (afastados.data_inicio.Date == DateTime.Now.Date)
                    {
                        executa_bloqueio(afastados.usu_codigo);
                    }

                    afastados = null;
                    ViewBag.res = "Afastamento de colaborador inserido com sucesso !";
                    ModelState.Clear();
                    ViewBag.tip_codigo = new SelectList(_afastadosapp.busca_tipos().ToList(), "tip_codigo",
                        "tip_descricao");
                    
                }
                else
                {
                    ViewBag.tip_codigo = new SelectList(_afastadosapp.busca_tipos().ToList(), "tip_codigo", "tip_descricao", afastados.tip_codigo);

                }
               
                return View(afastados);
            }
            catch (Exception ex)
            {

                ViewBag.tip_codigo = new SelectList(_afastadosapp.busca_tipos(), "tip_codigo", "tip_descricao");
                ViewBag.err = "Erro ao inserir afastamento do colaborador: " + ex.Message + ", contate o administrador.";
                return View(afastados);
            }


        }

        [HttpGet,Authorize]
        public ActionResult Manutencao(int? page, string dt1, string dt2,int? unidade)
        {

            try
            {


                if (_usuarioapp.verifica_permissao(5339) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Home", "Inicio");
                }

                DateTime data2;
                DateTime data1;

                if (DateTime.TryParse(dt1, out data1) == false)
                {
                    data1 = DateTime.Now.AddMonths(-1);
                }

                if (DateTime.TryParse(dt2, out data2) == false)
                {
                    data2 = DateTime.Now;
                }

                if (data2 < data1)
                {
                    ModelState.AddModelError("", "A data inicial não pode ser maior que a final");
                    data1 = DateTime.Now.AddMonths(-1);
                    data2 = DateTime.Now;
                }

                ViewBag.dt1 = data1.ToString();
                ViewBag.dt2 = data2.ToString();
                ViewBag.unidade = unidade ?? -1;


                const int pageSize = 10;
                ViewBag.uni_codigo = new SelectList(_usuarioapp.busca_unidades(1), "uni_codigo", "uni_descricao",-1);
                var pagedavisos = _afastadosapp.Listar(data1, data2,unidade ?? -1).ToList().ToPagedList(page ?? 1, pageSize);
                return View("Manutencao", pagedavisos);


            }
            catch (Exception ex)
            {
                throw ex;
            }


        }

        [HttpPost, Authorize]
        public ActionResult Manutencao(FormCollection form)
        {

            try
            {
               
                 

                DateTime data2;
                DateTime data1;

                if (DateTime.TryParse(form["calendario1"], out data1) == false)
                {
                    data1 = DateTime.Now.AddYears(-1);
                }

                if (DateTime.TryParse(form["calendario2"], out data2) == false)
                {
                    data2 = DateTime.Now;
                }

                if (data2 < data1)
                {
                    ModelState.AddModelError("", "A data inicial não pode ser maior que a final");
                    data1 = DateTime.Now.AddYears(-1);
                    data2 = DateTime.Now;
                }

                int unidade = int.Parse(form["uni_codigo"]);
                ViewBag.dt1 = data1.ToString();
                ViewBag.dt2 = data2.ToString();
                ViewBag.unidade = unidade;


                const int pageSize = 10;
                var pagedavisos = _afastadosapp.Listar(data1, data2,unidade).ToPagedList(1, pageSize);
                ViewBag.uni_codigo = new SelectList(_usuarioapp.busca_unidades(1), "uni_codigo", "uni_descricao", unidade);
                return View(pagedavisos);
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

        [HttpGet, Authorize]
        public ActionResult Listar(string nome)
        {


            try
            {

                var oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
                string sJSON = oSerializer.Serialize(_usuarioapp.Listar("n",0,nome).ToList());
                return Json(sJSON, JsonRequestBehavior.AllowGet);


            }
            catch (Exception ex)
            {
                ViewBag.err = "Erro ao recuperar usuários: " + ex.Message + ",contate o administrador";
                throw ex;
            }

        }


        public ActionResult busca_usuarios()
        {
            try
            {

                return View();
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

       

        [HttpPost, Authorize]
        public CrystalReportPdfResult relatorio_pdf(FormCollection form)
        {
            try
            {



                ReportClass rptH = new ReportClass();

                rptH.FileName = Server.MapPath("~/Areas/Intranet/Relatorios/relusuariosafastados.rpt");//Indica o endereço do relatório
                rptH.Load();

                rptH.OpenSubreport("relusuariosafastados.rpt");
                rptH.SetDatabaseLogon(Generica.user_banco, Generica.senha_banco);

                DateTime data2;
                DateTime data1;

              


                int unidade = int.Parse(form["uni_codigo"]);

                if (unidade == -1)
                {
                    rptH.SetParameterValue("where", "");
                }
                else
                {
                    rptH.SetParameterValue("where", " and uni_codigo=" + unidade);
                }



                if (DateTime.TryParse(form["calendario1"], out data1) == false)
                {
                    rptH.SetParameterValue("data1", Generica.retorna_data(DateTime.Parse("1950-01-01")));
                }
                else
                {
                    rptH.SetParameterValue("data1", Generica.retorna_data(data1));
                }

                if (DateTime.TryParse(form["calendario2"], out data2) == false)
                {
                    rptH.SetParameterValue("data2",Generica.retorna_data(DateTime.Parse("2150-01-01")));

                }
                else
                {
                    rptH.SetParameterValue("data2", Generica.retorna_data(data2));
                }


                IEnumerable<VW_unidade> unidades = _usuarioapp.busca_unidades(1);

                rptH.SetParameterValue("usuariologado", _usuarioapp.GetUsuarioLogado(0).usu_login);
                
                rptH.SetParameterValue("unidadedesc", unidades.FirstOrDefault(x => x.uni_codigo == unidade).uni_descricao);
                //Stream stream = rptH.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);//Diz o tipo de stream, no pdf para Crystal Reports




                ViewBag.dt1 = data1.ToString();
                ViewBag.dt2 = data2.ToString();
                ViewBag.unidade = unidade;
                ViewBag.uni_codigo = new SelectList(unidades, "uni_codigo", "uni_descricao", unidade);


                return new CrystalReportPdfResult(rptH);


            }
            catch (Exception ex)
            {

                throw ex;
            }


        }


    }
}